[bits 32]
global asm_interrupt_empty_handler
global asm_hello_world
global asm_lidt
global asm_halt


ASM_UNHANDLED_INTERRUPT_INFO db 'Unhandled interrupt happened, halt...', 0


; void asm_lidt(uint32 start, uint16 limit)

asm_lidt:

    push ebp
    mov ebp, esp
    push eax
    mov eax, [ebp + 4 * 3]
    mov [ASM_IDTR], ax
    mov eax, [ebp + 4 * 2]
    mov [ASM_IDTR + 2], eax
    lidt [ASM_IDTR]
    pop eax
    pop ebp
    ret

ASM_IDTR dw 0

      dd 0

; void asm_interrupt_empty_handler()
asm_interrupt_empty_handler:
    cli                     ; 关闭中断
    mov esi, ASM_UNHANDLED_INTERRUPT_INFO  ; 将字符串地址加载到 esi
    xor ebx, ebx            ; 清零 ebx，用于显存偏移
    mov ah, 0x03            ; 设置字符属性为青色

.output_information:
    cmp byte [esi], 0       ; 检查字符串是否结束
    je .end                 ; 如果结束，跳转到结束
    mov al, byte [esi]      ; 加载当前字符
    mov word [gs:bx], ax    ; 将字符写入显存
    inc esi                 ; 移动到下一个字符
    add ebx, 2              ; 移动到下一个显存位置
    jmp .output_information ; 循环

.end:
    jmp $                   ; 死循环

; void asm_hello_world()
asm_hello_world:
    push eax
    xor eax, eax
    mov ah, 0x03            ; 设置字符属性为青色

    ; 打印学号 23336111
    mov al, '2'
    mov [gs:2 * 0], ax
    mov al, '3'
    mov [gs:2 * 1], ax
    mov al, '3'
    mov [gs:2 * 2], ax
    mov al, '3'
    mov [gs:2 * 3], ax
    mov al, '6'
    mov [gs:2 * 4], ax
    mov al, '1'
    mov [gs:2 * 5], ax
    mov al, '1'
    mov [gs:2 * 6], ax
    mov al, '1'
    mov [gs:2 * 7], ax
    mov al, ' '
    mov [gs:2 * 8], ax

    mov al, ' '
    mov [gs:2 * 9], ax

    mov al, ' '
    mov [gs:2 * 10], ax

    pop eax
    ret

; void asm_halt()
asm_halt:
    jmp asm_halt            ; 死循环